#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
条码生成算法 - 基于逆向工程的Python实现
根据项目编号(1-80)和批次(1-60)生成二进制条码
"""

def generate_barcode_number(project_id, batch_id):
    """
    根据项目编号和批次计算条码编号

    Args:
        project_id (int): 项目编号 (1-80)
        batch_id (int): 批次 (1-60)

    Returns:
        int: 条码编号
    """
    if not (1 <= project_id <= 80):
        raise ValueError("项目编号必须在1-80之间")
    if not (1 <= batch_id <= 60):
        raise ValueError("批次必须在1-60之间")

    # 条码编号 = (项目编号-1) * 60 + 批次
    return (project_id - 1) * 60 + batch_id

def find_valid_15bit_number(target_count):
    """
    查找第target_count个满足条件的15位数
    条件：15位二进制数按3位一组分组，每组中1的个数之和等于6
    
    Args:
        target_count (int): 目标序号
    
    Returns:
        int: 找到的15位数，如果未找到返回None
    """
    if target_count > 5005:
        return None
    
    found_count = 0
    
    for num in range(0x7FFF):  # 0 到 32767
        # 计算三组位中1的个数
        group1_count = 0  # 位 0,3,6,9,12
        group2_count = 0  # 位 1,4,7,10,13  
        group3_count = 0  # 位 2,5,8,11,14
        
        temp_num = num
        for i in range(5):  # 处理5组，每组3位
            group1_count += temp_num & 1
            temp_num >>= 1
            group2_count += temp_num & 1
            temp_num >>= 1
            group3_count += temp_num & 1
            temp_num >>= 1
        
        # 检查是否满足条件：三组的1的总数等于6
        if group1_count + group2_count + group3_count == 6:
            found_count += 1
            if found_count == target_count:
                return num
    
    return None

def convert_to_binary_string(num):
    """
    将15位数转换为15位二进制字符串
    
    Args:
        num (int): 15位数
    
    Returns:
        str: 15位二进制字符串
    """
    binary_str = ""
    for i in range(14, -1, -1):  # 从第14位到第0位
        bit = (num >> i) & 1
        binary_str += '1' if bit == 1 else '0'
    return binary_str

def encode_binary_string(binary_str):
    """
    对15位二进制字符串进行编码
    
    编码规则：
    - 偶数位置的'1' -> 'A'
    - 奇数位置的'1' -> 'B'  
    - 偶数位置的'0' -> 'C'
    - 奇数位置的'0' -> 'D'
    
    Args:
        binary_str (str): 15位二进制字符串
    
    Returns:
        str: 编码后的字符串
    """
    encoded = ""
    for i, bit in enumerate(binary_str):
        if bit == '1':
            if i % 2 == 0:  # 偶数位置
                encoded += 'A'
            else:  # 奇数位置
                encoded += 'B'
        else:  # bit == '0'
            if i % 2 == 0:  # 偶数位置
                encoded += 'C'
            else:  # 奇数位置
                encoded += 'D'
    return encoded

def expand_encoded_string(encoded_str):
    """
    展开编码字符串为最终的条码
    
    展开规则：
    - 'A' -> "11"
    - 'B' -> "00"
    - 'C' -> "1"
    - 'D' -> "0"
    
    Args:
        encoded_str (str): 编码字符串
    
    Returns:
        str: 最终的二进制条码字符串
    """
    result = ""
    for char in encoded_str:
        if char == 'A':
            result += "11"
        elif char == 'B':
            result += "00"
        elif char == 'C':
            result += "1"
        elif char == 'D':
            result += "0"
    return result

def generate_barcode(project_id, batch_id):
    """
    生成条码的主函数
    
    Args:
        project_id (int): 项目编号 (1-80)
        batch_id (int): 批次 (1-60)
    
    Returns:
        str: 二进制条码字符串，失败返回None
    """
    try:
        # 1. 计算条码编号
        barcode_number = generate_barcode_number(project_id, batch_id)
        print(f"项目编号: {project_id}, 批次: {batch_id}")
        print(f"条码编号: {barcode_number}")
        
        # 2. 查找对应的15位数
        valid_number = find_valid_15bit_number(barcode_number)
        if valid_number is None:
            print("错误：未找到有效的15位数")
            return None
        
        print(f"找到的15位数: {valid_number} (0x{valid_number:04X})")
        
        # 3. 转换为二进制字符串
        binary_str = convert_to_binary_string(valid_number)
        print(f"15位二进制: {binary_str}")
        
        # 4. 编码
        encoded_str = encode_binary_string(binary_str)
        print(f"编码字符串: {encoded_str}")
        
        # 5. 展开为最终条码
        final_barcode = expand_encoded_string(encoded_str)
        print(f"最终条码: {final_barcode}")
        
        return final_barcode
        
    except ValueError as e:
        print(f"输入错误: {e}")
        return None

def verify_15bit_condition(num):
    """
    验证15位数是否满足条件

    Args:
        num (int): 15位数

    Returns:
        tuple: (是否满足条件, 三组计数)
    """
    group1_count = 0  # 位 0,3,6,9,12
    group2_count = 0  # 位 1,4,7,10,13
    group3_count = 0  # 位 2,5,8,11,14

    temp_num = num
    for i in range(5):
        group1_count += temp_num & 1
        temp_num >>= 1
        group2_count += temp_num & 1
        temp_num >>= 1
        group3_count += temp_num & 1
        temp_num >>= 1

    total = group1_count + group2_count + group3_count
    return total == 6, (group1_count, group2_count, group3_count, total)

def analyze_barcode(barcode_str):
    """
    分析条码字符串的组成

    Args:
        barcode_str (str): 条码字符串

    Returns:
        dict: 分析结果
    """
    analysis = {
        'length': len(barcode_str),
        'ones_count': barcode_str.count('1'),
        'zeros_count': barcode_str.count('0'),
        'pattern_11_count': barcode_str.count('11'),
        'pattern_00_count': barcode_str.count('00'),
    }
    return analysis

def interactive_mode():
    """交互式条码生成"""
    print("=== 交互式条码生成器 ===")
    print("输入项目编号(1-80)和批次(1-60)来生成条码")
    print("输入 'q' 退出\n")

    while True:
        try:
            user_input = input("请输入项目编号和批次(格式: 项目编号 批次): ").strip()
            if user_input.lower() == 'q':
                break

            parts = user_input.split()
            if len(parts) != 2:
                print("错误：请输入两个数字，用空格分隔")
                continue

            project_id = int(parts[0])
            batch_id = int(parts[1])

            print(f"\n生成条码...")
            barcode = generate_barcode(project_id, batch_id)

            if barcode:
                analysis = analyze_barcode(barcode)
                print(f"\n条码分析:")
                print(f"  长度: {analysis['length']}")
                print(f"  '1'的个数: {analysis['ones_count']}")
                print(f"  '0'的个数: {analysis['zeros_count']}")
                print(f"  '11'模式个数: {analysis['pattern_11_count']}")
                print(f"  '00'模式个数: {analysis['pattern_00_count']}")

            print("\n" + "="*60 + "\n")

        except ValueError:
            print("错误：请输入有效的数字")
        except KeyboardInterrupt:
            break

    print("再见！")

def test_algorithm():
    """测试算法的正确性"""
    print("=== 条码生成算法测试 ===\n")

    # 测试用例
    test_cases = [
        (1, 1),   # 第1个条码
        (2, 1),   # 第2个条码
        (1, 2),   # 第81个条码
        (80, 60), # 最后一个条码
        (10, 5),  # 随机测试
    ]

    for project_id, batch_id in test_cases:
        print(f"\n--- 测试: 项目{project_id}, 批次{batch_id} ---")
        barcode = generate_barcode(project_id, batch_id)
        if barcode:
            analysis = analyze_barcode(barcode)
            print(f"条码长度: {analysis['length']}")
            print(f"条码内容: {barcode}")
            print(f"分析: 1的个数={analysis['ones_count']}, 0的个数={analysis['zeros_count']}")
        print("-" * 50)

def main():
    """主函数"""
    import sys

    if len(sys.argv) == 1:
        # 无参数，运行测试
        test_algorithm()
        print("\n" + "="*60)
        interactive_mode()
    elif len(sys.argv) == 3:
        # 两个参数，直接生成条码
        try:
            project_id = int(sys.argv[1])
            batch_id = int(sys.argv[2])
            barcode = generate_barcode(project_id, batch_id)
            if barcode:
                print(f"条码: {barcode}")
        except ValueError:
            print("错误：请输入有效的数字")
    else:
        print("用法:")
        print("  python barcode_generator.py                    # 运行测试和交互模式")
        print("  python barcode_generator.py <项目编号> <批次>   # 直接生成条码")

if __name__ == "__main__":
    main()
